#ifndef SOFTKEYBOARD_2_H
#define SOFTKEYBOARD_2_H

#include <QMainWindow>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QMultiHash>
#include <QFile>
#include <QMessageBox>
#include <QRegExp>
#include <QFont>
#include <QTimer>
#include <QStackedWidget>
#include <QMouseEvent>
#include <QPoint>
#define CANDIDATEWORDNUM 6   //中文输入 默认6个候选词

class softKeyBoard_2 : public QWidget
{
    Q_OBJECT
public:
    explicit softKeyBoard_2(QWidget *parent = 0);

    void readDictionary();//读拼音字典，将汉字与拼音的对应存放到hash表中

    void setLetterLow();//设置小写字母显示
    void setLetterUpper();//设置大写字母显示
    void setSymbolsEN();//设置符号（英文状态）
    void setSymbolsCH();//设置符号（中文状态）
    //重写事件过滤器适配键盘操作

    bool eventFilter(QObject *watched, QEvent *event);



    //主要的对外接口
    void selectKeyboardStyle(int num);//选择键盘样式
    void setTextBufferAreaVisibled(bool isVisibled=true);//设置输入缓冲区是否显示
    void setTitleLabelText(const QString &titleLabelText);
    void setCurrentLineEditText(const QString &currentEidtText);
    void setCurrentLineEdit(QLineEdit *currentEdit);
signals:
    void sendText(QString text);//以信号的形式将输入文本发出去

public slots:
    void numberLetterBtnSlot();//数字字母(符号)按键被点击的响应槽

    void candidateLetterChangedSlot(QString text);//候选字母改变响应槽
    void candidateWordBtnSlot();//候选词被点击的响应槽
    void candidateWordPrePageSlot();//候选词向前翻页
    void candidateWordNextPageSlot();//候选词向后翻页

    void changeUpperLowerSlot();//切换大小写，也可以切换数字字母与符号界面
    void deleteTextSlot();//删除输入
    void closeDelTimerSlot();//关闭连续删除的定时器
    void changeSkinSlot();//切换皮肤
    void changeLetterSymbolSlot();//数字字母与字符切换
    void spaceSlot();//空格被按下时的响应槽
    void changeChEnSlot();//中英文切换
    void enterSlot();//回车被按下的响应槽

    void quitSlot();//退出按钮的响应槽
private:

    void initStyleSheet();//初始化可选样式表，用于不同的皮肤展示
    void initNumberLetterBtn();//初始化数字字母按键，分配空间，连接信号与槽
    void initSpecialBtn();//初始化特殊功能按键，诸如大小写切换，删除按键等

    void initTextBufferArea();//初始化输入缓存区
    void initFunctionAndCandidateArea();//初始化功能和候选区域
    void initKeyBoardArea();//初始化按键区域

    void splitPhrase(QString phrase,QString chinese);//拆分拼音词组
    void matchChinese(QString pinyin);//根据输入的拼音匹配中文
    void displayCandidateWord(int page);//显示指定页的候选词
    void hideCandidateArea();//隐藏中文输入显示区域
    QMultiHash<QString,QString> chinesePinyin;//使用哈希表来存放拼音汉字的键值对 一键多值
    QList<QString> hanzi;//存储匹配的汉字词
    QTimer *delTimer;//实现长按删除键 删除定时

    /***************各种状态变量***************/
    //模式
    bool isENInput;//中英文输入模式
    bool isLetterInput;//数字字母或符号输入模式
    bool isLetterLower;//大小写模式
    int skinNum;//当前皮肤编号
    int pageCount;//候选词当前页
    /**************键盘输入缓存区**************/
    QWidget *textBufferArea;
    QLabel *titleLabel;
    QLineEdit *lineEdit;
    //键盘当前的输入缓存区，可以接受外面传递的指针，默认为lineEdit
    QLineEdit *currentLineEdit;
    /***********键盘功能及候选词区域************/
    QStackedWidget *functionAndCandidateArea;//是一个能左右翻页的widget
    //功能区  后期可以添加各种功能配置的入口按钮
    QWidget *functionArea;
    QLabel *introduceLabel;
    //候选词区域 包括候选字母、候选词和翻页按钮
    QWidget *candidateArea;//是存放候选词等的widget
    QLineEdit *candidateLetter;//中文输入时对应的字母显示
    QWidget *candidateWordArea;
    QPushButton *candidateWordBtn[CANDIDATEWORDNUM];//中文输入时的候选词
    QPushButton *prePageBtn;//前一页
    QPushButton *nextPageBtn;//后一页

    /***************键盘按键区域****************/
    QWidget *keyBoardArea;//键盘的按键区域
    QPushButton *numberLetterBtn[36];//10个数字按键，26个字母按键,同时可以显示符号
    //特殊功能按键
    QPushButton *upperOrLowerBtn;//大小写转换按键
    QPushButton *deleteBtn;//删除按键
    QPushButton *skinBtn;//切换皮肤
    QPushButton *letterOrSymbolBtn;//数字字母与符号切换按键
    QPushButton *commaBtn;//逗号按键
    QPushButton *spaceBtn;//空格按键
    QPushButton *periodBtn;//句号按键
    QPushButton *chOrEnBtn;//中英文切换按键
    QPushButton *enterBtn;//回车按键
    QList <QPushButton * >btnlist_ui;//用来存放按键进行事件过滤器重写

    /************按键以及整个键盘的样式***********/
    QStringList keyBoardAreaStyle;//按键区域的样式
    QStringList functionAndCandidateAreaStyle;//功能和候选区区域的样式
    QStringList candidateLetterStyle;//候选字母样式
    QStringList commonKeyStyle;//普通按键的样式
    QStringList specialKeyStyle;//特殊按键的样式

};

#endif // SOFTKEYBOARD_2_H
